/**
 * 基于单向链表实现元素存取的容器
 * @param
 */
public class MySingleList <E> implements MyList<E> {
    /**
     * 定义单向链表中的节点对象
     */
    class Node<E>{
        private  E item ;//存储元素
        private  Node next;//存储下一个节点对象的地址
        Node(E item,Node next){
            this.item=item;
            this.next=next;
        }
    }
private Node head;//存放链表中的头结点
private  int size;

    @Override
    public void add(E element) {
    //创建节点
    Node<E> node=new Node<>(element,null);
    //尾节点
     Node tail=getTail();

     if(tail==null){
         this.head=node;
     }else {
         tail.next=node;
     }
    }

    private  Node getTail(){
        //判断头结点是否存在
        if(this.head==null){
            return null;
        }

        //查找尾节点
        Node node=this.head;
        while (true){
            if(node.next==null){
                break;
            }
          node=node.next;

        }
        return node;
    }

    @Override
    public E get(int index) {



        //校验Index的合法性
        this.checkIndex(index);

        //根据位置获取指定节点
         Node<E> node=this.getNode(index);

        //将该节点中的元素返回
        return node.item;

    }
    private void checkIndex(int index){
        if(!(index>=0 && index<this.size)){
            throw new IndexOutOfBoundsException("Index:"+index+"Size"+this.size);
        }
    }
private Node getNode(int index){
        Node<E> node=this.head;
        for (int i=0;i<index;i++){
            node=node.next;
        }
        return node;
}
    @Override
    public int size() {
        return this.size;
    }

    @Override
    public E remove(int index) {
//校验index的合法性
        this.checkIndex(index);
//根据位置找到节点对象
        Node <E> node=this.getNode(index);
//获取该节点对象的元素
        E item= node.item;
//将该节点对象从单向链表中移除
        if(this.head==node){
            this.head=node.next;
        }else {
            Node<E> temp=this.head;
            for(int i=0;i<index-1;i++){
                temp=temp.next;
            }
            temp.next=node.next;
        }
        node.next=null;
        this.size--;

//记录元素个数
//将该元素返回
        return item;
    }

    public static void main(String[] args) {
        MySingleList <String> mySingleList=new MySingleList<>();
        mySingleList.add("a");
        mySingleList.add("b");
        mySingleList.add("c");
        mySingleList.add("d");
        System.out.println(mySingleList.size);
    }
}
